<?
/**
*		Chỉnh sửa: tuannk (20101208)
*		Phiên bản: 0.5
*		Ngày: 20-10-2010
*		Tên lớp: SohaPay
*		Chức năng: Tích hợp thanh toán qua API
*			- Xây dựng URL chuyển thông tin tới Soha Payment để xử lý việc thanh toán cho merchant site.
*			- Xác thực tính chính xác của thông tin đơn hàng được gửi về từ Soha Payment.
**/
class SohaPay 
{
	//list cac goi thanh toán online						   
	const CARD_RATE = 0.87;// nạp thẻ mệnh giá 100 tương ứng CARD_RATE * 100 VNĐ.
	const SMS_RATE  = 7000;// nạp thẻ mệnh giá 100 tương ứng CARD_RATE * 100 VNĐ. 
	
	// URL checkout của Soha Payment
	private $pg_url = 'https://sohapay.com/payment.php';

	// URL query của Soha Payment
	private $pg_url_query = 'https://sohapay.com/payment_query.php';
	
	// Mã merchante site 
	//private $merchant_site_code = 'test'; // Biến này được Soha Payment cung cấp cho merchant site
	private $merchant_site_code = RB_MERCHANT_SITE_CODE;	// Biến này được SohaPay cung cấp cho merchant site
	
	// Mật khẩu bảo mật
	//private $secure_secret= '123456789'; // Biến này được Soha Payment cung cấp cho merchant site
	private $secure_secret= RB_SECURE_CODE; // Biến này được SohaPay cung cấp cho merchant site
	
	//Mảng giá trị thẻ cào
	static $cardInfo 		= array(
								'10000' => 20,
								'20000' => 40,
								'30000' => 60,
								'50000' => 100,
								'100000' => 210,
								'200000' => 430,
								'300000' => 650,
								'500000' => 1300
							);
								
	//Mảng chưa thông tin về gói lượt up Cập nhật ngày 5/4/2011
	static $itemPackage = array(
							1 	=> array('num_up'=>40,   'transfer'  => 15000,  'sms' => 45000,  'card' => 20000),
							2 	=> array('num_up'=>100,  'transfer'  => 40000,  'sms' => 90000,  'card' => 50000),
							3 	=> array('num_up'=>150,  'transfer'  => 50000,  'sms' => 150000, 'card' => 80000),
							4 	=> array('num_up'=>300,  'transfer'  => 100000, 'sms' => 300000, 'card' => 150000),
							5 	=> array('num_up'=>600,  'transfer'  => 200000, 'sms' => 600000, 'card' => 240000),
							6 	=> array('num_up'=>900,  'transfer'  => 300000, 'sms' => 900000, 'card' => 380000),
							7 	=> array('num_up'=>1600, 'transfer'  => 500000, 'sms' => 1605000,'card' => 600000),
						);
							
	//list cac goi thanh toán online						   
	static $rbp 		= array(
							'RBU01' => array(
										'type'	=>1,//1:RBU, 2:RBD
										'value'	=>150,//lượt up
										'price'	=>50000,//VNĐ
										'price_format'	=>"50.000",//VNĐ
										'des'	=>'150 lượt up',
										),
										
							'RBU02' => array('type'	=>1,'value'	=>300,'price'	=>100000,'price_format'		=>"100.000",'des'	=>'300 lượt up'),
							'RBU03' => array('type'	=>1,'value'	=>600,'price'	=>200000,'price_format'		=>"200.000",'des'	=>'600 lượt up'),
							'RBU04' => array('type'	=>1,'value'	=>1600,'price'	=>500000,'price_format'		=>"500.000",'des'	=>'1.600 lượt up'),
							'RBU05' => array('type'	=>1,'value'	=>3300,'price'	=>1000000,'price_format'	=>"100.0000",'des'	=>'3.300 lượt up'),
							'RBU06' => array('type'	=>1,'value'	=>5200,'price'	=>1500000,'price_format'	=>"1.500.000",'des'	=>'5.200 lượt up'),
							'RBU07' => array('type'	=>1,'value'	=>7000,'price'	=>2000000,'price_format'	=>"2.000.000",'des'	=>'7.000 lượt up'),
							'RBU08' => array('type'	=>1,'value'	=>10500,'price'	=>3000000,'price_format'	=>"3.000.000",'des'	=>'10.500 lượt up'),
							'RBU09' => array('type'	=>1,'value'	=>14500,'price'	=>4000000,'price_format'	=>"4.000.000",'des'	=>'14.500 lượt up'),
							'RBU10' => array('type'	=>1,'value'	=>18500,'price'	=>5000000,'price_format'	=>"5.000.000",'des'	=>'18.500 lượt up'),
							'RBU11' => array('type'	=>1,'value'	=>40000,'price'	=>10000000,'price_format'	=>"10.000.000",'des'=>'40.000 lượt up')
							);
							
	//Mảng chưa thông tin về giá và số ngày bán của các chuyên mục						   
	static $catePay = array(
							1 	=> array('price'	=>75000),//Máy tính và Laptop
							2 	=> array('price'	=>95000),//Điện thoại
							//15 	=> array('price'	=>100000),//Mua Bán nhà đất
							//19 	=> array('price'	=>100000),//Ô tô
							20 	=> array('price'	=>55000),//Xe máy, Xe đạp
							69 	=> array('price'	=>55000),//Lao động phổ thông
							83 	=> array('price'	=>55000),//Du lịch
							100	=> array('price'	=>55000),//Cơ hội giao thương
							264 => array('price'	=>55000),//Lao động trí óc
							266 => array('price'	=>60000),//Thời trang, Mỹ phẩm
							272 => array('price'	=>75000),//Thuê và cho thuê nhà
							275	=> array('price'	=>55000),//Tổng Hợp
							276 => array('price'	=>60000),//Mua sắm 
							279 => array('price'	=>60000),//Điện tử, Kỹ thuật số
							280 => array('price'	=>60000),//Điện lạnh, Điện máy
							278 => array('price'	=>75000),//Chợ Sim
							287 => array('price'	=>60000),//Dịch vụ Gia đình
							288 => array('price'	=>60000),//Dịch vụ Doanh nghiệp
							289 => array('price'	=>60000),//Dịch vụ Cá nhân
							291 => array('price'	=>55000)//Nội thất
						);
							
	//Hàm xây dựng url, trong đó có tham số mã hóa (còn gọi là public key)
	static function buildCheckoutUrl_old($return_url, $transaction_info, $order_code, $price, $order_email='',$site_code,$secure_code)
	{
		
		// Mảng các tham số chuyển tới Soha Payment
		$arr_param = array(
			'site_code'			=>	strval($site_code),
			'return_url'		=>	strval($return_url),
			'transaction_info'	=>	strval($transaction_info),
			'order_code'		=>	strval($order_code),
			'price'				=>	strval($price),	
			'order_email'		=>	strval($order_email),
		);
		
		ksort($arr_param);
		/* Bước 2. Kiểm tra  biến $redirect_url xem có '?' không, nếu không có thì bổ sung vào*/
		$redirect_url = SOHA_PAYMENT_CHECK_OUT_URL;
		if (strpos($redirect_url, '?') === false)
		{
			$redirect_url .= '?';
		}
		else if (substr($redirect_url, strlen($redirect_url)-1, 1) != '?' && strpos($redirect_url, '&') === false)
		{
			// Nếu biến $redirect_url có '?' nhưng không kết thúc bằng '?' và có chứa dấu '&' thì bổ sung vào cuối
			$redirect_url .= '&';			
		}
				
		/* Bước 3. tạo url*/
		$first = true;
		$secure_code = $secure_code;
		foreach ($arr_param as $key=>$value)
		{
			if ($first == true){
				$redirect_url .= urlencode($key) . '=' . urlencode($value);
				$first = false;
			}
			else
				$redirect_url .= '&' . urlencode($key) . '=' . urlencode($value);
			
			$secure_code .= $value;
		}
		
		if (strlen($secure_code) > 0) {
		    $redirect_url .= "&secure_hash=" . strtoupper(md5($secure_code));
		}
		
		return $redirect_url;
	}
	
	//Hàm xây dựng url, trong đó có tham số mã hóa (còn gọi là public key)
	public function buildCheckoutUrl($return_url, $transaction_info, $order_code, $price, $order_email, $order_mobile, $site_code,  $secure_code)
	{
		
		// Mảng các tham số chuyển tới Soha Payment
		$arr_param = array(
			'site_code'			=>	strval($this->merchant_site_code),
			'return_url'		=>	strval($return_url),
			'transaction_info'	=>	strval($transaction_info),
			'order_code'		=>	strval($order_code),
			'price'				=>	strval($price),	
			'order_email'		=>	strval($order_email),
			'order_mobile'		=>	strval($order_mobile),
			'version'			=>  '2'
		);
		
		ksort($arr_param);
		/* Bước 2. Kiểm tra  biến $redirect_url xem có '?' không, nếu không có thì bổ sung vào*/
		$redirect_url = SOHA_PAYMENT_CHECK_OUT_URL;
		if (strpos($redirect_url, '?') === false)
		{
			$redirect_url .= '?';
		}
		else if (substr($redirect_url, strlen($redirect_url)-1, 1) != '?' && strpos($redirect_url, '&') === false)
		{
			// Nếu biến $redirect_url có '?' nhưng không kết thúc bằng '?' và có chứa dấu '&' thì bổ sung vào cuối
			$redirect_url .= '&';			
		}
				
		/* Bước 3. tạo url*/
		$first = true;
		//$secure_code = $secure_code;	
		$secure_code = '';	
		foreach ($arr_param as $key=>$value)
		{
			if (strlen($value) == 0) continue;
			
			if ($first == true){
				$redirect_url .= urlencode($key) . '=' . urlencode($value);
				$first = false;
			}
			else
				$redirect_url .= '&' . urlencode($key) . '=' . urlencode($value);
			
			$secure_code .= $key . "=" . $value . "&";
		}
		$secure_code = rtrim($secure_code, "&");
		
		if (strlen($secure_code) > 0) {
		    $redirect_url .= "&secure_hash=" . strtoupper(hash_hmac('SHA256', $secure_code, pack('H*',$this->secure_secret)));
		}
		
		return $redirect_url;
	}
	
	/*Hàm thực hiện xác minh tính đúng đắn của các tham số trả về từ Soha Payment*/	
	static function verifyReturnUrl_old($secure_code)
	{
		$secure_hash 				= @$_GET['secure_code'];
		unset($_GET['secure_code']);
	
		$param['transaction_info']	= @$_GET['transaction_info'];
		$param['order_code'] 		= @$_GET['order_code'];
		$param['order_email'] 		= @$_GET['order_email'];
		$param['order_session'] 	= @$_GET['order_session'];
		$param['price'] 			= @$_GET['price'];
		$param['site_code'] 		= @$_GET['site_code'];
		$param['response_code'] 	= @$_GET['response_code'];
		$param['response_message'] 	= @$_GET['response_message'];
		$param['payment_type'] 		= @$_GET['payment_type'];
		$param['payment_time'] 		= @$_GET['payment_time'];
		$param['error_text'] 		= @$_GET['error_text'];
	
		ksort($param);
		$md5HashData = $secure_code;	
	
	    foreach($param as $key => $value) {
	        if ($key != "secure_code" or strlen($value) > 0) {
	            $md5HashData .= urldecode($value);
	        }
	    }
	    
	    if (strtoupper($secure_hash) == strtoupper(md5($md5HashData))) {
	        return TRUE;
	    } else {
	        return FALSE;
	    }
	}
	
	/*Hàm thực hiện xác minh tính đúng đắn của các tham số trả về từ Soha Payment*/
	public function verifyReturnUrl($secure_code)
	{
		$secure_hash = isset($_GET['secure_code'])?$_GET['secure_code']:"";
		unset($_GET['secure_code']);
	
		$param['transaction_info']	= isset($_GET['transaction_info'])?$_GET['transaction_info']:"";
		$param['order_code'] 		= isset($_GET['order_code'])?$_GET['order_code']:"";
		$param['order_email'] 		= isset($_GET['order_email'])?$_GET['order_email']:"";
		$param['order_session'] 	= isset($_GET['order_session'])?$_GET['order_session']:"";
		$param['price'] 			= isset($_GET['price'])?$_GET['price']:"";
		$param['site_code'] 		= isset($_GET['site_code'])?$_GET['site_code']:"";
		$param['response_code'] 	= isset($_GET['response_code'])?$_GET['response_code']:"";
		$param['response_message'] 	= isset($_GET['response_message'])?$_GET['response_message']:"";
		$param['payment_type'] 		= isset($_GET['payment_type'])?$_GET['payment_type']:"";
		$param['payment_time'] 		= isset($_GET['payment_time'])?$_GET['payment_time']:"";
		$param['error_text'] 		= isset($_GET['error_text'])?$_GET['error_text']:"";
	
		ksort($param);
		//$md5HashData = $secure_code;
		$md5HashData = '';
	    foreach($param as $key => $value) {
	        if ($key != "secure_code" && strlen($value) > 0) {
	            $md5HashData .= $key . "=" . $value . "&";
	        }
	    }
	    $md5HashData = rtrim($md5HashData, "&");

	    if (strtoupper($secure_hash) == strtoupper(hash_hmac('SHA256', $md5HashData, pack('H*',$this->secure_secret)))) {
	        return TRUE;
	    } else {
	        return FALSE;
	    }
	}
	
	static function queryOrderStatus_old($order_code,$site_code,$secure_code){
		// Mảng các tham số chuyển tới Soha Payment
		$arr_param = array(
			'site_code'			=>	strval($site_code),
			'order_code'		=>	strval($order_code),
			'command'			=>	'query'
		);
		
		ksort($arr_param);
		/* Bước 2. Kiểm tra  biến $redirect_url xem có '?' không, nếu không có thì bổ sung vào*/
		$query_url = SOHA_PAYMENT_QUERY_URL;
		if (strpos($query_url, '?') === false)
		{
			$query_url .= '?';
		}
		else if (substr($query_url, strlen($query_url)-1, 1) != '?' && strpos($query_url, '&') === false)
		{
			// Nếu biến $redirect_url có '?' nhưng không kết thúc bằng '?' và có chứa dấu '&' thì bổ sung vào cuối
			$query_url .= '&';			
		}
				
		/* Bước 3. tạo url*/
		$first = true;

		foreach ($arr_param as $key=>$value)
		{
			if ($first == true){
				$query_url .= urlencode($key) . '=' . urlencode($value);
				$first = false;
			}
			else
				$query_url .= '&' . urlencode($key) . '=' . urlencode($value);
			
			$secure_code .= $value;
		}
		
		if (strlen($secure_code) > 0) {
		    $query_url .= "&secure_hash=" . strtoupper(md5($secure_code));
		}
		
		ob_start();
	
		// initialise Client URL object
		$ch = curl_init();
	
		// set the URL of the VPC
		curl_setopt ($ch, CURLOPT_URL, $query_url);
		curl_setopt ($ch, CURLOPT_POST, 0);
		curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
		curl_exec ($ch);
	
		// get response
		$response = ob_get_contents();
		
		// turn output buffering off.
		ob_end_clean();
		
		$map = array();
	
	    $pairArray = explode("&", $response);
	    foreach ($pairArray as $pair) {
	        $param = explode("=", $pair);
	        $map[urldecode($param[0])] = urldecode($param[1]);
	    }
	    $map['shp_payment_response_description'] = '';
	    if (isset($map['shp_payment_type']) && $map['shp_payment_type']==1) $map['shp_payment_response_description'] = self::getResponseDescriptionInternational($map['shp_payment_response_code']);
	    else if (isset($map['shp_payment_type']) && $map['shp_payment_type']==2) $map['shp_payment_response_description'] = self::getResponseDescriptionDomestic($map['shp_payment_response_code']);
	    
	    return $map;
	}
	
	public function queryOrderStatus($order_code, $command='query'){
		// Mảng các tham số chuyển tới Soha Payment
		$arr_param = array(
			'site_code'			=>	strval($this->merchant_site_code),
			'order_code'		=>	strval($order_code),
			'command'			=>	$command,
			'version'			=>  '2'
		);
		
		ksort($arr_param);
		/* Bước 2. Kiểm tra  biến $redirect_url xem có '?' không, nếu không có thì bổ sung vào*/
		$query_url = SOHA_PAYMENT_QUERY_URL;
		if (strpos($query_url, '?') === false)
		{
			$query_url .= '?';
		}
		else if (substr($query_url, strlen($query_url)-1, 1) != '?' && strpos($query_url, '&') === false)
		{
			// Nếu biến $redirect_url có '?' nhưng không kết thúc bằng '?' và có chứa dấu '&' thì bổ sung vào cuối
			$query_url .= '&';			
		}

		/* Bước 3. tạo url*/
		$first = true;
		$secure_code = '';
		foreach ($arr_param as $key=>$value)
		{
			if (strlen($value) == 0) continue;
			
			if ($first == true){
				$query_url .= urlencode($key) . '=' . urlencode($value);
				$first = false;
			}
			else
				$query_url .= '&' . urlencode($key) . '=' . urlencode($value);
			
			$secure_code .= $key . "=" . $value . "&";
		}
		$secure_code = rtrim($secure_code, "&");
		
		if (strlen($secure_code) > 0) {
		    $query_url .= "&secure_hash=" . strtoupper(hash_hmac('SHA256', $secure_code, pack('H*',$this->secure_secret)));
		}
		
		ob_start();
	
		// initialise Client URL object
		$ch = curl_init();
		
		// set the URL of the VPC
		curl_setopt ($ch, CURLOPT_URL, $query_url);
		curl_setopt ($ch, CURLOPT_POST, 0);
		curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
		curl_exec ($ch);
	
		// get response
		$response = ob_get_contents();
		
		// turn output buffering off.
		ob_end_clean();
		
		// close client URL
		curl_close ($ch);

		$map = array();

	    $pairArray = explode("&", $response);
	    foreach ($pairArray as $pair) {
	        $param = explode("=", $pair);
	        $map[urldecode($param[0])] = urldecode($param[1]);
	    }
	    
	    $map['shp_payment_response_description'] = '';
	    if ($map['shp_payment_type']==1) $map['shp_payment_response_description'] = $this->getResponseDescriptionInternational($map['shp_payment_response_code']);
	    else if ($map['shp_payment_type']==2) $map['shp_payment_response_description'] = $this->getResponseDescriptionDomestic($map['shp_payment_response_code']);
	    else if ($map['shp_payment_type']==3) $map['shp_payment_response_description'] = $this->getResponseDescriptionMobileCard($map['shp_payment_response_code']);
	    
	    return $map;
	}
	
	static function getResponseDescriptionInternational_old($responseCode) {
	    switch ($responseCode) {
	        case "0" : $result = "Giao dịch thành công"; break;
	        case "?" : $result = "Tình trạng giao dịch không xác định"; break;
	        case "1" : $result = "Lỗi không xác định"; break;
	        case "2" : $result = "Ngân hàng từ tối giao dịch"; break;
	        case "3" : $result = "Không có trả lời từ Ngân hàng"; break;
	        case "4" : $result = "Thẻ hết hạn"; break;
	        case "5" : $result = "Số dư không đủ để thanh toán"; break;
	        case "6" : $result = "Lỗi giao tiếp với Ngân hàng"; break;
	        case "7" : $result = "Lỗi Hệ thống máy chủ Thanh toán"; break;
	        case "8" : $result = "Loại giao dịch không được hỗ trợ"; break;
	        case "9" : $result = "Ngân hàng từ chối giao dịch (không liên hệ với Ngân hàng)"; break;
	        case "A" : $result = "giao dịch Aborted"; break;
	        case "B" : $result = "Bị chặn do có rủi ro giả mạo"; break;
	        case "C" : $result = "giao dịch bị hủy bỏ"; break;
	        case "D" : $result = "giao dịch hoãn lại đã được nhận và đang chờ xử lý"; break;
	        case "E" : $result = "Referred"; break;
	        case "F" : $result = "3D Secure xác thực không thành công"; break;
	        case "I" : $result = "Card Security Code xác minh không thành công"; break;
	        case "L" : $result = "Mua sắm giao dịch đã bị khoá (Xin vui lòng thử lại sau giao dịch)"; break;
	        case "N" : $result = "Chủ thẻ không ghi danh vào chương trình xác thực"; break;
	        case "P" : $result = "giao dịch đã được nhận bởi các Adaptor Thanh toán và đang được xử lý"; break;
	        case "R" : $result = "giao dịch đã không được xử lý - Đã đạt đến giới hạn của những cố gắng thử lại cho phép"; break;
	        case "S" : $result = "SessionID bị trùng (OrderInfo)"; break;
	        case "T" : $result = "Địa chỉ xác minh không đúng"; break;
	        case "U" : $result = "Card Security Code không đúng"; break;
	        case "V" : $result = "Địa chỉ xác minh và Card Security Code không đúng"; break;
	        case "9999": $result = "Giao dịch có rủi ro giả mạo";break;
	        case "PG": $result = "Không tồn tại giao dịch trên hệ thống";break;
	        default  : $result = "Không thể xác định"; 
	    }
	    return $result;
	}
	
	public function getResponseDescriptionInternational($responseCode) {
	    switch ($responseCode) {
	        case "0" : $result = "Giao dịch thành công"; break;
	        case "?" : $result = "Tình trạng giao dịch không xác định"; break;
	        case "1" : $result = "Lỗi không xác định"; break;
	        case "2" : $result = "Ngân hàng từ tối giao dịch"; break;
	        case "3" : $result = "Không có trả lời từ Ngân hàng"; break;
	        case "4" : $result = "Thẻ hết hạn"; break;
	        case "5" : $result = "Số dư không đủ để thanh toán"; break;
	        case "6" : $result = "Lỗi giao tiếp với Ngân hàng"; break;
	        case "7" : $result = "Lỗi Hệ thống máy chủ Thanh toán"; break;
	        case "8" : $result = "Loại giao dịch không được hỗ trợ"; break;
	        case "9" : $result = "Ngân hàng từ chối giao dịch (không liên hệ với Ngân hàng)"; break;
	        case "A" : $result = "giao dịch Aborted"; break;
	        case "B" : $result = "Bị chặn do có rủi ro giả mạo"; break;
	        case "C" : $result = "giao dịch bị hủy bỏ"; break;
	        case "D" : $result = "giao dịch hoãn lại đã được nhận và đang chờ xử lý"; break;
	        case "E" : $result = "Referred"; break;
	        case "F" : $result = "3D Secure xác thực không thành công"; break;
	        case "I" : $result = "Card Security Code xác minh không thành công"; break;
	        case "L" : $result = "Mua sắm giao dịch đã bị khoá (Xin vui lòng thử lại sau giao dịch)"; break;
	        case "N" : $result = "Chủ thẻ không ghi danh vào chương trình xác thực"; break;
	        case "P" : $result = "giao dịch đã được nhận bởi các Adaptor Thanh toán và đang được xử lý"; break;
	        case "R" : $result = "giao dịch đã không được xử lý - Đã đạt đến giới hạn của những cố gắng thử lại cho phép"; break;
	        case "S" : $result = "SessionID bị trùng (OrderInfo)"; break;
	        case "T" : $result = "Địa chỉ xác minh không đúng"; break;
	        case "U" : $result = "Card Security Code không đúng"; break;
	        case "V" : $result = "Địa chỉ xác minh và Card Security Code không đúng"; break;
	        case "9999": $result = "Giao dịch có rủi ro giả mạo";break;
	        case "9998": $result = "Giao dịch có rủi ro giả mạo, cần xác thực chủ thẻ";break;
	        case "PG": $result = "Không tồn tại giao dịch trên hệ thống";break;
	        default  : $result = "Không thể xác định"; 
	    }
	    return $result;
	}
	
	static function getResponseDescriptionDomestic_old($responseCode){
		switch ($responseCode) {
	        case "0" : $result = "Giao dịch thành công"; break;
	        case "1" : $result = "Ngân hàng từ chối giao dịch"; break;
	        case "3" : $result = "Mã đơn vị không tồn tại"; break;
	        case "4" : $result = "Không đúng access code"; break;
	        case "5" : $result = "Số tiền không hợp lệ"; break;
	        case "6" : $result = "Mã tiền tệ không tồn tại"; break;
	        case "7" : $result = "Lỗi không xác định"; break;
	        case "8" : $result = "Số thẻ không đúng"; break;
	        case "9" : $result = "Tên chủ thẻ không đúng"; break;
	        case "10" : $result = "Thẻ hết hạn/Thẻ bị khóa"; break;
	        case "11" : $result = "Thẻ chưa đăng ký sử dụng dịch vụ thanh toán trực tuyến."; break;
	        case "12" : $result = "Ngày phát hành/Hết hạn không đúng"; break;
	        case "13" : $result = "Vượt quá hạn mức thanh toán"; break;
	        case "21" : $result = "Số dư không đủ để thanh toán"; break;
	        case "99" : $result = "Người sử dụng hủy giao dịch"; break;
	        case "100" : $result = "Không nhập thông tin thẻ/ Hủy giao dịch thanh toán"; break;
	        case "PG": $result = "Không tồn tại giao dịch trên hệ thống";break;
	        default  : $result = "Không thể xác định";
		}
		return $result;
	}
	
	public function getResponseDescriptionDomestic($responseCode){
		switch ($responseCode) {
	        case "0" : $result = "Giao dịch thành công"; break;
	        case "1" : $result = "Ngân hàng từ chối giao dịch"; break;
	        case "3" : $result = "Mã đơn vị không tồn tại"; break;
	        case "4" : $result = "Không đúng access code"; break;
	        case "5" : $result = "Số tiền không hợp lệ"; break;
	        case "6" : $result = "Mã tiền tệ không tồn tại"; break;
	        case "7" : $result = "Lỗi không xác định"; break;
	        case "8" : $result = "Số thẻ không đúng"; break;
	        case "9" : $result = "Tên chủ thẻ không đúng"; break;
	        case "10" : $result = "Thẻ hết hạn/Thẻ bị khóa"; break;
	        case "11" : $result = "Thẻ chưa đăng ký sử dụng dịch vụ thanh toán trực tuyến."; break;
	        case "12" : $result = "Ngày phát hành/Hết hạn không đúng"; break;
	        case "13" : $result = "Vượt quá hạn mức thanh toán"; break;
	        case "21" : $result = "Số dư không đủ để thanh toán"; break;
	        case "99" : $result = "Người sử dụng hủy giao dịch"; break;
	        case "100" : $result = "Không nhập thông tin thẻ/ Hủy giao dịch thanh toán"; break;
	        case "PG": $result = "Không tồn tại giao dịch trên hệ thống";break;
	        default  : $result = "Không thể xác định";
		}
		return $result;
	}	

    static function listBankCode($banking_type){
        switch ($banking_type) {
                case "mb_bank"      : $result = 1; break;
                case "acb_bank"     : $result = 2; break;
                case "vc_bank"      : $result = 3; break;
                case "vib_bank"     : $result = 4; break;
                case "donga_bank"   : $result = 5; break;
                case "techcom_bank" : $result = 6; break;
                case "bidv_bank"    : $result = 7; break;
                case "vietinbank"   : $result = 8; break;
                case "agribank"     : $result = 9; break;
                default             : $result = "Không thể xác định";break;
            }
        return $result;
    }

    static function listBanking($bankCode, $note=false){
        if(!$note){
            switch ($bankCode) {
                case "1" : $result = "Ngân hàng thương mại cổ phần Quân đội"; break;
                case "2" : $result = "Ngân hàng Á Châu chi nhánh Hà Nội (ACB)"; break;
                case "3" : $result = "Ngân hàng Vietcombank (VCB) Hà Nội"; break;
                case "4" : $result = "Ngân hàng TMCP Quốc tế Việt Nam(VIB)"; break;
                case "5" : $result = "Ngân hàng Đông Á chi nhánh Bạch Mai Hà Nội"; break;
                case "6" : $result = "Ngân hàng TECHCOMBANK Hà Nội"; break;
                case "7" : $result = "Ngân hàng Đầu Tư và Phát Triển Việt Nam (BIDV)"; break;
                case "8" : $result = "Ngân hàng TMCP Công Thương Việt Nam (Vietinbank)"; break;
                case "9" : $result = "Ngân hàng Nông Nghiệp và Phát Triển Nông Thôn Việt Nam (Agribank)"; break;
                default  : $result = "Không thể xác định";break;
            }
        }else{
            switch ($bankCode) {
                case "1" : $result = "Ngân hàng thương mại cổ phần Quân đội: Chấp nhận chuyển qua ATM, nộp tiền trực tiếp tại ngân hàng."; break;
                case "2" : $result = "Ngân hàng Á Châu chi nhánh Hà Nội (ACB)): Chấp nhận chuyển qua ATM, nộp tiền trực tiếp tại ngân hàng."; break;
                case "3" : $result = "Ngân hàng Vietcombank (VCB) Hà Nội: Chấp nhận chuyển khoản qua ATM, nộp tiền trực tiếp tại ngân hàng nhưng không được chuyển khoản online từ tài khản cá nhân sang tài khoản công ty. "; break;
                case "4" : $result = "Ngân hàng TMCP Quốc tế Việt Nam(VIB)): Chấp nhận chuyển qua ATM, nộp tiền trực tiếp tại ngân hàng."; break;
                case "5" : $result = "Ngân hàng Đông Á chi nhánh Bạch Mai Hà Nội: Khách hàng chỉ có thể nộp tiền trực tiếp tại ngân hàng hoặc chuyển ATM từ Đông Á sang Đông Á"; break;
                case "6" : $result = "Ngân hàng TECHCOMBANK Hà Nội: Chấp nhận chuyển qua ATM, nộp tiền trực tiếp tại ngân hàng."; break;
                case "7" : $result = "Ngân hàng Đầu Tư và Phát Triển Việt Nam (BIDV): Khách hàng chỉ có thể nộp tiền trực tiếp tại ngân hàng hoặc chuyển ATM từ BIDV sang BIDV"; break;
                case "8" : $result = "Ngân hàng TMCP Công Thương Việt Nam (Vietinbank): Chấp nhận chuyển khoản qua ATM, nộp tiền trực tiếp tại ngân hàng nhưng không được chuyển khoản online từ tài khản cá nhân sang tài khoản công ty."; break;
                case "9" : $result = "Ngân hàng Nông Nghiệp và Phát Triển Nông Thôn Việt Nam (Agribank): Khách hàng chỉ có thể nộp tiền trực tiếp tại ngân hàng hoặc chuyển ATM từ Agribank sang Agribank"; break;
                default  : $result = "Không thể xác định";break;
            }
        }
		
		return $result;
	}

    static function listAccountNumber($bankCode){
		switch ($bankCode) {
	        case "1" : $result = "0651100016002"; break; //Ngân hàng thương mại cổ phần Quân đội 
	        case "2" : $result = "37182319"; break; //Ngân hàng Á Châu chi nhánh Hà Nội (ACB)
	        case "3" : $result = "0021001839243"; break; //Ngân hàng Vietcombank (VCB) Hà Nội 
	        case "4" : $result = "001704060035755"; break; //Ngân hàng TMCP Quốc tế Việt Nam(VIB) - Sở Giao dịch VIB 
	        case "5" : $result = "002387340001"; break;//Ngân hàng Đông Á chi nhánh Bạch Mai Hà Nội
	        case "6" : $result = "10320141354011"; break;//Ngân hàng TECHCOMBANK Hà Nội
	        case "7" : $result = "12010000318895"; break;//Ngân hàng Đầu Tư và Phát Triển Việt Nam
	        case "8" : $result = "102010001108169"; break;//Ngân hàng TMCP Công Thương Việt Nam (Vietinbank)
	        case "9" : $result = "1483201004740"; break;//Ngân hàng Nông Nghiệp và Phát Triển Nông Thôn Việt Nam (Agribank)
	        default  : $result = "Không thể xác định";break;

		}
		return $result;
	}

    static function infoForUser($val,$type){
        $re="";
        if($type == 'tp'){
            switch ($val) {
                case "1":
                    $re = "Hà Nội";
                    break;
                case "2":
                    $re = "Hồ Chí Minh";
                    break;
            }
        }else if($type == 'time'){
            switch ($val) {
                case "1":
                    $re = "Sáng";
                    break;
                case "2":
                    $re = "Chiều";
                    break;
                case "3":
                    $re = "Tối";
                    break;
            }
        }
        return $re;
    }
    
    /**
     * Thanh toán thẻ cào điện thoại
     *
     * @param varchar $card_code: Mã thẻ cào điện thoại
     * @param int $card_type: kiểu thẻ cào
     * @param text $transaction_info: Thông tin thanh toán
     * @param varchar $order_code: Mã đơn hàng
     * @param varchar $order_email: Email
     * @param varchar $order_mobile: Tel
     * @return unknown
     */
    public function doChargeCard_old($card_code, $card_type, $transaction_info, $order_code, $order_email, $order_mobile){
		//xác min xem có phải chạy test mode không
		$this->isTestMode();
		// Mảng các tham số chuyển tới Soha Payment
		$arr_param = array(
			'site_code'			=>	strval($this->merchant_site_code),
			'card_code'			=>	strval($card_code),
			'card_type'			=>	strval($card_type), // vinaphone or mobifone
			'transaction_info'	=>	strval($transaction_info),
			'order_code'		=>	strval($order_code),
			'order_email'		=>	strval($order_email),
			'order_mobile'		=>	strval($order_mobile),
			'command'			=>	'doChargeMobileCard'
		);
		ksort($arr_param);
		/* Bước 2. Kiểm tra  biến $redirect_url xem có '?' không, nếu không có thì bổ sung vào*/
		$query_url = $this->pg_url_query;
		if (strpos($query_url, '?') === false)
		{
			$query_url .= '?';
		}
		else if (substr($query_url, strlen($query_url)-1, 1) != '?' && strpos($query_url, '&') === false)
		{
			// Nếu biến $redirect_url có '?' nhưng không kết thúc bằng '?' và có chứa dấu '&' thì bổ sung vào cuối
			$query_url .= '&';			
		}
				
		/* Bước 3. tạo url*/
		$first = true;
		$secure_code = $this->secure_secret;
		foreach ($arr_param as $key=>$value)
		{
			if ($first == true){
				$query_url .= urlencode($key) . '=' . urlencode($value);
				$first = false;
			}
			else
				$query_url .= '&' . urlencode($key) . '=' . urlencode($value);
			
			$secure_code .= $value;
		}
		
		if (strlen($secure_code) > 0) {
		    $query_url .= "&secure_hash=" . strtoupper(md5($secure_code));
		}
		ob_start();
	
		// initialise Client URL object
		$ch = curl_init();
	
		// set the URL of the VPC
		curl_setopt ($ch, CURLOPT_URL, $query_url);
		curl_setopt ($ch, CURLOPT_POST, 0);
		curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
		curl_exec ($ch);
	
		// get response
		$response = ob_get_contents();
		
		// turn output buffering off.
		ob_end_clean();
		
		// close client URL
		curl_close ($ch);

		$map = array();
		$response = substr($response, 1);
		
	    $pairArray = explode("&", $response);
	    foreach ($pairArray as $pair) {
	        $param = explode("=", $pair);
			
	        $map[urldecode($param[0])] = urldecode($param[1]);
	    }
	    
	    $map['shp_payment_response_description'] = $this->getResponseDescriptionMobileCard($map['response_code']);
	    
	    return $map;
	}
	
	public function doChargeCard($card_code, $card_type, $transaction_info, $order_code, $order_email, $order_mobile, $card_seri=''){
		// Mảng các tham số chuyển tới Soha Payment
		$arr_param = array(
			'site_code'			=>	strval($this->merchant_site_code),
			'card_code'			=>	strval($card_code),
			'card_seri'			=>	strval($card_seri),
			'card_type'			=>	strval($card_type), // vinaphone or mobifone
			'transaction_info'	=>	strval($transaction_info),
			'order_code'		=>	strval($order_code),
			'order_email'		=>	strval($order_email),
			'order_mobile'		=>	strval($order_mobile),
			'command'			=>	'doChargeMobileCard',
			'version'			=>  '2'
		);
		
		ksort($arr_param);
		/* Bước 2. Kiểm tra  biến $redirect_url xem có '?' không, nếu không có thì bổ sung vào*/
		$query_url = $this->pg_url_query;
		if (strpos($query_url, '?') === false)
		{
			$query_url .= '?';
		}
		else if (substr($query_url, strlen($query_url)-1, 1) != '?' && strpos($query_url, '&') === false)
		{
			// Nếu biến $redirect_url có '?' nhưng không kết thúc bằng '?' và có chứa dấu '&' thì bổ sung vào cuối
			$query_url .= '&';			
		}
				
		/* Bước 3. tạo url*/
		$first = true;
		$secure_code = '';
		foreach ($arr_param as $key=>$value)
		{
			if (strlen($value) == 0) continue;
			
			if ($first == true){
				$query_url .= urlencode($key) . '=' . urlencode($value);
				$first = false;
			}
			else
				$query_url .= '&' . urlencode($key) . '=' . urlencode($value);
			
			$secure_code .= $key . "=" . $value . "&";
		}
		$secure_code = rtrim($secure_code, "&");
		
		if (strlen($secure_code) > 0) {
		    $query_url .= "&secure_hash=" . strtoupper(hash_hmac('SHA256', $secure_code, pack('H*',$this->secure_secret)));
		}
		
		ob_start();
	
		// initialise Client URL object
		$ch = curl_init();
	
		// set the URL of the VPC
		curl_setopt ($ch, CURLOPT_URL, $query_url);
		curl_setopt ($ch, CURLOPT_POST, 0);
		curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
		curl_exec ($ch);
	
		// get response
		$response = ob_get_contents();
		
		// turn output buffering off.
		ob_end_clean();
		
		// close client URL
		curl_close ($ch);

		$map = array();
		$response = substr($response, 1);

	    $pairArray = explode("&", $response);
	    foreach ($pairArray as $pair) {
	        $param = explode("=", $pair);
	        $map[urldecode($param[0])] = urldecode($param[1]);
	    }
	    
	    $map['shp_payment_response_description'] = $this->getResponseDescriptionMobileCard($map['response_code']);
	    
	    return $map;
	}		
	
	public function getResponseDescriptionMobileCard_old($responseCode){
		switch ($responseCode) {
	        case "1" : $result = "Giao dịch thành công"; break;
	        case "-1" : $result = "Thẻ đã sử dụng (Mobifone)"; break;
	        case "-2" : $result = "Thẻ đã khoá (Mobifone)"; break;
	        case "-3" : $result = "Thẻ đã hết hạn sử dụng (Mobifone)"; break;
	        case "-4" : $result = "Thẻ chưa kích hoạt (Mobifone)"; break;
	        case "-10" : $result = "Mã thẻ không đúng định dạng (Mobifone)"; break;
	        case "-12" : $result = "Thẻ không tồn tại (Mobifone)"; break;
	        case "-99" : $result = "Lỗi hệ thống nạp của Mobile"; break;
	        case "0" : $result = "Lỗi khác (Mobifone)"; break;
	        case "2" : $result = "Không login sử dụng các hàm charge"; break;
	        case "3" : $result = "Lỗi hệ thống của VDCO"; break;
	        case "4" : $result = "Thẻ không sử dụng được (lỗi chung cho Vinaphone)"; break;
	        case "5" : $result = "Thực hiện sai 5 lần liên tiếp"; break;
	        case "6" : $result = "Thực hiện lệnh logout không thành công"; break;
	        case "8" : $result = "Charge thẻ bị lỗi hệ thống. Lỗi này cần kiểm soát và đối soát"; break;
	        case "9" : $result = "Thông tin partner không đúng"; break;
	        case "10" : $result = "Sai format thông tin email hoặc mobile"; break;
	        default  : $result = "Không thể xác định";
		}
		return $result;
	}
	
	public function getResponseDescriptionMobileCard($responseCode){
		switch ($responseCode) {
	        case "1" : $result = "Giao dịch thành công"; break;
	        case "-1" : $result = "Thẻ đã sử dụng"; break;
	        case "-2" : $result = "Thẻ đã khoá"; break;
	        case "-3" : $result = "Thẻ đã hết hạn sử dụng"; break;
	        case "-4" : $result = "Thẻ chưa kích hoạt"; break;
	        case "-10" : $result = "Mã thẻ không hợp lệ"; break;
	        case "-11" : $result = "Mã thẻ không hợp lệ"; break;
	        case "-12" : $result = "Thẻ không tồn tại"; break;
	        case "-99" : $result = "Lỗi hệ thống"; break;
	        case "0" : $result = "Lỗi khác"; break;
	        case "2" : $result = "Không login sử dụng các hàm charge"; break;
	        case "3" : $result = "Lỗi hệ thống của VDCO"; break;
	        case "4" : $result = "Thẻ không sử dụng được (lỗi chung cho Vinaphone)"; break;
	        case "5" : $result = "Thực hiện sai 5 lần liên tiếp"; break;
	        case "6" : $result = "Thực hiện lệnh logout không thành công"; break;
	        case "8" : $result = "Charge thẻ bị lỗi hệ thống. Lỗi này cần kiểm soát và đối soát"; break;
	        case "9" : $result = "Thông tin partner không đúng"; break;
	        case "10" : $result = "Sai format thông tin email hoặc mobile"; break;
	        default  : $result = "Không thể xác định";
		}
		return $result;
	}
	
	public function showResponseMobileCard($responseCode){
		switch ($responseCode) {
	        case "1" : $result = "Giao dịch thành công"; break;
	        case "-1" : $result = "Thẻ đã sử dụng"; break;
	        case "-2" : $result = "Thẻ đã khoá"; break;
	        case "-3" : $result = "Thẻ đã hết hạn sử dụng"; break;
	        case "-4" : $result = "Thẻ chưa kích hoạt"; break;
	        case "-10" : $result = "Mã thẻ không đúng định dạng"; break;
	        case "-12" : $result = "Thẻ không tồn tại"; break;
	        //case "-99" : $result = "Lỗi hệ thống nạp của Mobile"; break;
	        //case "0" : $result = "Lỗi khác (Mobifone)"; break;
			//case "2" : $result = "Không login sử dụng các hàm charge"; break;
	        //case "3" : $result = "Lỗi hệ thống của VDCO"; break;
	        case "4" : $result = "Thẻ không sử dụng được"; break;
	        //case "5" : $result = "Thực hiện sai 5 lần liên tiếp"; break;
	        //case "6" : $result = "Thực hiện lệnh logout không thành công"; break;
	        //case "8" : $result = "Charge thẻ bị lỗi hệ thống. Lỗi này cần kiểm soát và đối soát"; break;
	        //case "9" : $result = "Thông tin partner không đúng"; break;
	        //case "10" : $result = "Sai định dạng thông tin email hoặc mobile"; break;
	        default  : $result = "Không nạp được thẻ";
		}
		return $result;
	}
	/*Hàm thực hiện lấy chế độ, test hoặc không*/
	function isTestMode(){
		if(PAYGATE_TEST_MODE){
			$this->merchant_site_code = 'test';
			$this->secure_secret = '123456789';
			//$this->pg_url = 'http://pay.todo.vn/payment.php';
			//$this->pg_url_query = 'http://pay.todo.vn/payment_query.php';
			
			//$this->pg_url 		= 'http://paydev.todo.vn/payment.php';
			//$this->pg_url_query = 'http://paydev.todo.vn/payment_query.php';
			
			$this->pg_url 		= 'http://pay.todo.vn/payment.php';
			$this->pg_url_query = 'http://pay.todo.vn/payment_query.php';
			
		}
	}
	
	//Hàm lấy thông tin từ soha
	function getSohaInfo($order_code = '')
	{
		if($order_code != '')
		{
			$arrReturn = $this->queryOrderStatus($order_code);
	
			if(is_array($arrReturn) && !empty($arrReturn))
			{
				if(isset($arrReturn['shp_payment_time']) && $arrReturn['shp_payment_time'] != '')
				{
	                $arrReturn['shp_payment_time'] = strtotime($arrReturn['shp_payment_time']);
					return $arrReturn;
				}
				else
				{
					return 'not_order';
				}
			}
			else
			{
				return 'not_connect';
			}
		}
	}
}
?>